﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio.clases_tontas;
using Negocio.catalogos;
using Negocio;
using System.Diagnostics.CodeAnalysis;

namespace Presentacion.controlasistencia
{
    public partial class Asistencias : System.Web.UI.Page
    {

        // Objeto con metodos de encriptamiento
        encriptaje _objEncriptaje = new encriptaje();

        //Catalogos 
        catalogoDistribucion _objDistribucion = new catalogoDistribucion();
        catalogoHorario _objHorarioClases = new catalogoHorario();
        catalogoEstudiante _objCatalogoEstudiante = new catalogoEstudiante();
        catalogoCabecera _objCatalogoCabecera = new catalogoCabecera();
        catalogoCabeceraAsistencia _objCatologoCabeceraAsistencia = new catalogoCabeceraAsistencia();
        catalogoCalendarioAcademico _objCatalogoCalendarioAcademico = new catalogoCalendarioAcademico();
        catalogoAsistencia _objCatalogoAsistencia = new catalogoAsistencia();
        catalogoPermiso _objCatalogoPermiso = new catalogoPermiso();
        StringBuilder horarioHTML = new StringBuilder();
        StringBuilder tablaEstudiante = new StringBuilder();

        string horaInicio = "", horaFin = "";
        DateTime dia = DateTime.Now;
        int nroLista = 0;
        string codigoDistribucion = "";
        int nroHoraDistribucion = 0, idPeriodoActual = 0;
        int idCabecera = 0, idCabeceraAsistencia = 0;
        //int nroHoraMateria = 0;
        TimeSpan _intervaloHoraEntrada = new TimeSpan();
        TimeSpan _intervaloHoraSalida = new TimeSpan();

        #region Load de la Pagina
        public void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["cod"] != null && Session["idDocente"] != null && Session["periodo"] != null)
            {
                codigoDistribucion = _objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString());
                int __idDistribucion = int.Parse(codigoDistribucion);
                idPeriodoActual = int.Parse(Session["periodo"].ToString());


                var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(int.Parse(codigoDistribucion)).First();
                int totalHoraAcumuladas = _objCatalogoCabecera.obtenerHorasTrabajadasAcumuladas(__idDistribucion, idPeriodoActual);
                int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(__idDistribucion, idPeriodoActual, DateTime.Now);
                int totalMesesAnterior = totalHoraAcumuladas - totalMesActual;

                var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);

                var resultCabecera = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(__idDistribucion, idPeriodoActual, dia);
                if (resultCabecera.Count != 0)
                {
                    var resultXDiaCabecera = resultCabecera.Where(E => E.protegido == true);

                    if (resultXDiaCabecera.Count() > 0)
                    {
                        btnConfirmarAsistencia.Visible = false;
                    }
                    else
                    {
                        btnConfirmarAsistencia.Visible = true;
                    }

                }
                #region Datos Horario

                dia = DateTime.Now; //Obtiene dia actual
                string[] diasSemana = new string[] { "LU", "MA", "MI", "JU", "VI" };
                //Buscar inicio de semana
                //Inicio busqueda inicio de semana
                while (dia.DayOfWeek != DayOfWeek.Monday)
                {
                    if (dia.DayOfWeek == DayOfWeek.Sunday)
                    {
                        dia = dia.AddDays(1);
                    }
                    else
                    {
                        dia = dia.AddDays(-1);
                    }
                }

                //Carga del horario para validacion
                var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(int.Parse(Session["periodo"].ToString()), int.Parse(codigoDistribucion));

                if (consultaHorario.Count() > 0)
                {
                    horarioHTML.Clear();
                    //Bucle por cada de la semana
                    int totalSemanal = 0;
                    int totalDiario = 0;
                    for (int i = 0; i < 5; i++)
                    {
                        horaInicio = "";
                        horaFin = "";
                        nroHoraDistribucion = 0;
                        totalDiario = 0;
                        var resultFiltroHorario = consultaHorario.Where(E => E.detalle == dia.DayOfWeek.ToString()).ToList();
                        if (resultFiltroHorario.Count > 0)
                        {
                            TimeSpan _intervaloHoraEntradaPrimero = TimeSpan.Parse(resultFiltroHorario.First().horaEntrada);
                            TimeSpan _intervaloHoraSalidaUltimo = TimeSpan.Parse(resultFiltroHorario.First().horaSalida);

                            foreach (var item in resultFiltroHorario)
                            {
                                TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                                TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                                DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                                totalDiario += nroHoraDistribucion;
                                totalSemanal = totalSemanal + nroHoraDistribucion;
                                //fin busqueda dia de la semana                   

                                if (_intervaloHoraEntrada <= _intervaloHoraEntradaPrimero)
                                {
                                    horaInicio = _intervaloHoraEntrada.ToString();
                                }

                                if (_intervaloHoraSalida >= _intervaloHoraSalidaUltimo)
                                {
                                    horaFin = _intervaloHoraSalida.ToString();
                                }

                            }

                            horarioHTML.Append("<tr class='success'><td><p class='text-center'>" + diasSemana[i].ToString() + "</p></td><td><p class='text-center'>" + horaInicio + "</p></td><td><p class='text-center'>" + horaFin + "</p></td><td><p class='text-center'>" + totalDiario + "</p></td></tr>");
                        }
                        else
                        {
                            horarioHTML.Append("<tr><td><p class='text-center'>" + diasSemana[i].ToString() + "</p></td><td><p class='text-center'>" + horaInicio + "</p></td><td><p class='text-center'>" + horaFin + "</p></td><td><p class='text-center'>" + nroHoraDistribucion + "</p></td></tr>");
                        }

                        dia = dia.AddDays(1);

                    }
                    horario.InnerHtml = horarioHTML.ToString();
                    lblSemanal.Text = totalSemanal.ToString();


                }
                else
                {
                    lblSemanal.Text = "1";
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "alert('Ingrese el horario para poder continuar');", true);
                    Timer1.Enabled = true;
                }


                if (!(int.Parse(lblSemanal.Text) == resultDistribucion.horas))
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "alert('No ha completado el horario, por favor revisar.');", true);
                    Timer1.Enabled = true;
                }

                #endregion

                if (resultOpciones != null)
                {
                    lblTotalHoras.Text = (resultOpciones.nroSemanas * int.Parse(lblSemanal.Text)).ToString();
                }
                else
                {
                    lblTotalHoras.Text = "1";
                }

                lblTotalMesActual.Text = totalMesActual.ToString();
                lblTotalMesAnterior.Text = totalMesesAnterior.ToString();

                lblCarrera.Text = "CARRERA DE " + resultDistribucion.carrera;

                #region Datos Curso
                //Carga de los datos de la distribucion
                string datosDistribucion = "<tr><td>Docente:</td><td class='lista-estudiantes'>" + Session["apellido"].ToString() + " " + Session["nombresDocente"].ToString() + "</td></tr>" +
                    "<tr> <td>Curso:</td> <td class='lista-estudiantes'>" + resultDistribucion.Nombre + "</td></tr>" +
                     "<tr> <td>Semestre:</td> <td class='lista-estudiantes'>" + resultDistribucion.semestre + "</td></tr>" +
                     "<tr> <td>Paralelo:</td><td class='lista-estudiantes'>" + resultDistribucion.paralelo + "</td></tr>";
                datosCurso.InnerHtml = datosDistribucion;
                #endregion

                if (!IsPostBack)
                {
                    DateTime mesAnterior = DateTime.Now.AddMonths(-1);
                    var resultPermiso = new catalogoPermiso().obtenerPermisoXidDistribucionXidMes(__idDistribucion, idPeriodoActual, mesAnterior);
                    if (resultPermiso != null)
                    {
                        chbHabilitarReportes.Checked = resultPermiso.estado;
                    }
                    else
                    {
                        chbHabilitarReportes.Checked = false;
                    }
                    StringBuilder _textObservacion = new StringBuilder();
                    var resultCalendario = new catalogoCalendarioAcademico().obtenerCalendarioAcademicoxPeriodoANdMEs(idPeriodoActual, DateTime.Now);
                    if (resultCalendario.Count != 0)
                    {
                        _textObservacion.Append("Feriado:\n");
                        foreach (var item in resultCalendario)
                        {
                            _textObservacion.Append(item.start.Value.ToShortDateString() + ": " + item.title + "\n");
                        }
                    }
                    else
                    {
                        _textObservacion.Clear();
                    }

                    TextArea.InnerText = _textObservacion.ToString();
                    CargarHTML();
                }
            }
            else
            {
                Response.Redirect("Default.aspx");
            }


        }
        #endregion

        #region BotonTomarAsistencia
        protected void btnTomarAsistencia_Click(object sender, EventArgs e)
        {
            var habilitado = new Catalogo_Habilitado().consultar().FirstOrDefault();
            if (habilitado.estado == true)
            {
                if (Session["periodo"] != null && Request.QueryString["cod"] != null)
                {
                    #region ComprobacionAsistencia
                    //Codigo de distribucion desencriptado

                    //Horario Actual

                    //Fecha Actual
                    dia = DateTime.Now;

                    //Lista de cabecera
                    var resultCabecera = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), dia);
                    codigoDistribucion = _objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString());

                    var listadoEstudiante = _objCatalogoEstudiante.obtenerEstudiante(int.Parse(codigoDistribucion));
                    var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(int.Parse(Session["periodo"].ToString()), int.Parse(codigoDistribucion));

                    //Buscamos el dia en la base de datos en el horario
                    var resultFiltroHorario = (from itemHorario in consultaHorario
                                               where itemHorario.detalle == dia.DayOfWeek.ToString()
                                               select itemHorario);

                    //Busqueda de la cabecera guardadas 
                    if (resultCabecera.Count == 0)
                    {
                        var resultCalendario = _objCatalogoCalendarioAcademico.obtenerFechadelCalendarioComprobacionAsistencia(int.Parse(Session["periodo"].ToString()), dia);

                        if (resultFiltroHorario.Count() != 0 && (resultCalendario == null) && dia.DayOfWeek != DayOfWeek.Saturday && dia.DayOfWeek != DayOfWeek.Sunday)
                        {
                            //Ingreso de las cabeceraAsistencia con los id de los estudiantes

                            foreach (var itemFiltroHorario in resultFiltroHorario)
                            {
                                idCabecera = _objCatalogoCabecera.insertarCabecera(new cabecera(0, itemFiltroHorario, dia, false, 211048));

                                if (idCabecera != 0)
                                {
                                    int contador = 0;

                                    int nroHoraMateria = new catalogoHorario().obtenerNroHoraHorarioXIDDetalleHorario(itemFiltroHorario.idDetalleHorario);
                                    foreach (var item in listadoEstudiante)
                                    {
                                        // 211045 Mensaje Asistencia ingresada por el docente
                                        idCabeceraAsistencia = _objCatologoCabeceraAsistencia.insertarCabecetaAsistencia(new cabeceraAsistencia
                                        {
                                            idEstudiante = item.Id_Alumno,
                                            idCabecera = idCabecera,
                                            idObservacion = 211045
                                        });

                                        if (idCabeceraAsistencia != 0)
                                        {
                                            contador = 0;
                                            for (int i = 0; i < nroHoraMateria; i++)
                                            {
                                                if (
                                                    _objCatalogoAsistencia.ingresarAsistencia(new asistenciaClase(
                                                    0,
                                                    dia,
                                                    1,
                                                    idCabeceraAsistencia
                                                    ))
                                                    )
                                                {
                                                    contador++;
                                                }
                                                else
                                                {
                                                    i--;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al ingresar asistencia del estudiante " + item.Nombres + ", contactese con direccion de carrera.');", true);
                                        }// Comprobacion de cabecera Asistencia

                                    }//Bucle

                                }
                                else
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al ingresar la asistencia, recargue pagina');", true);

                                    break;
                                }//Comprobacion Cabecera 

                            }//Bucle Horario 
                             // Verificacion que esten ingresadas las cabeceras
                            var resultCabeceraConfirmacion = new catalogoCabecera().obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), DateTime.Now);
                            if (resultCabeceraConfirmacion.Count == resultFiltroHorario.Count())
                            {
                                btnConfirmarAsistencia.Visible = true;
                                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Puede empezar a tomar la asistencia');", true);
                            }
                            else
                            {
                                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Intente tomar asistencia de nuevo.');", true);
                            }

                        }//Cierre el if del dia

                        //Verificacion y ingreso sino esta ingresado en el dia anterior :D
                        resultFiltroHorario = (from itemHorario in consultaHorario
                                               where itemHorario.detalle == dia.AddDays(-1).DayOfWeek.ToString()
                                               select itemHorario);

                        var resultCalendarioDiaAnterior = _objCatalogoCalendarioAcademico.obtenerFechadelCalendarioComprobacionAsistencia(int.Parse(Session["periodo"].ToString()), dia.AddDays(-1));
                        if (resultFiltroHorario.Count() != 0 && resultCalendarioDiaAnterior == null)
                        {
                            var resultConfirmacionDiaAnterior = new catalogoCabecera().obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), DateTime.Now.AddDays(-1));
                            //Verifica si son iguales para activar la edicion del dia anterior
                            if (resultFiltroHorario.Count() > resultConfirmacionDiaAnterior.Count)
                            {
                                //Realiza el ingreso de la cabecera faltante
                                foreach (var item in resultFiltroHorario)
                                {
                                    if (!resultConfirmacionDiaAnterior.Exists(E => E.idDetalleHorario.idDetalleHorario == item.idDetalleHorario))
                                    {
                                        AgregarCabeceraFaltante(item, listadoEstudiante, dia.AddDays(-1));
                                    }
                                }
                                resultConfirmacionDiaAnterior = new catalogoCabecera().obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), DateTime.Now.AddDays(-1));
                                if (resultConfirmacionDiaAnterior.Count == resultFiltroHorario.Count())
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Puede empezar a modificar la asistencia del dia anterior');", true);
                                }
                                else
                                {
                                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Intente tomar asistencia de nuevo, recargue pagina');", true);


                                }

                            }
                        }
                        else
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('No tiene clases para editar del día de anterior.');", true);
                        }

                    }//cierre de la cabecera actual mas de cero
                    else
                    {
                        var resultCalendarioDia = _objCatalogoCalendarioAcademico.obtenerFechadelCalendarioComprobacionAsistencia(int.Parse(Session["periodo"].ToString()), DateTime.Now);
                        if (resultFiltroHorario.Count() != 0 && resultCalendarioDia == null)
                        {
                            //Verificacion que falta una cabecera actual
                            if (resultCabecera.Count < resultFiltroHorario.Count())
                            {

                                //Creacion de la cabeceras faltantes
                                foreach (var item in resultFiltroHorario)
                                {
                                    if (!resultCabecera.Exists(E => E.idDetalleHorario.idDetalleHorario == item.idDetalleHorario))
                                    {
                                        AgregarCabeceraFaltante(item, listadoEstudiante, dia);
                                    }
                                }

                            }//Cierre verificacion y creacion de cabceras faltantes :D  del dia actual
                            else
                            {
                                //Verificacion si los estudiantes estan ingresados si son apenas agregados a la matricula
                                var resultCabeceraDIAS = new catalogoCabecera().obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), DateTime.Now);
                                int contadorA = 0;
                                foreach (var item in resultCabeceraDIAS)
                                {
                                    var resultCabeceraAsistencia = _objCatologoCabeceraAsistencia.obtenerCabeceraAsistenciaXIDCabeceraXFecha(item.idCabecera, item.fechaCabecera);
                                    if (!(resultCabeceraAsistencia.Count == listadoEstudiante.Count))
                                    {
                                        foreach (var itemComprobacion in listadoEstudiante)
                                        {
                                            if (!resultCabeceraAsistencia.Exists(X => X.idEstudiante == itemComprobacion.Id_Alumno))
                                            {
                                                int nroHoraMateria = new catalogoHorario().obtenerNroHoraHorarioXIDDetalleHorario(item.idDetalleHorario.idDetalleHorario);

                                                idCabeceraAsistencia = _objCatologoCabeceraAsistencia.insertarCabecetaAsistencia(new cabeceraAsistencia
                                                {
                                                    idEstudiante = itemComprobacion.Id_Alumno,
                                                    idCabecera = idCabecera,
                                                    idObservacion = 211045
                                                });

                                                if (idCabeceraAsistencia != 0)
                                                {
                                                    contadorA = 0;
                                                    for (int i = 0; i < nroHoraMateria; i++)
                                                    {
                                                        if (
                                                            _objCatalogoAsistencia.ingresarAsistencia(new asistenciaClase(
                                                            0,
                                                            dia,
                                                            1,
                                                            idCabeceraAsistencia
                                                            ))
                                                            )
                                                        {
                                                            contadorA++;
                                                        }
                                                        else
                                                        {
                                                            i--;
                                                        }
                                                    }
                                                }
                                                else
                                                {
                                                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al ingresar asistencia del estudiante " + itemComprobacion.Nombres + ", con el administrador del sistema.');", true);
                                                }

                                            }//Validacion cabecera asistencia igual que la lista de estudiantes
                                        }//Cierre bucle horario
                                    }//cierre igual lista de estudiantes
                                }//Cierr foreach de la cabecera 
                            }//Cierre 
                        } // cierre filtro de horario mas de uno 1
                        else
                        {
                            //verificacion y creacion de asistencias y cabeceras del dia anterior 

                            var resultFiltradoHorarioDiaAnterior = (from itemHorario in consultaHorario
                                                                    where itemHorario.detalle == dia.AddDays(-1).DayOfWeek.ToString()
                                                                    select itemHorario);

                            resultCabecera = new catalogoCabecera().obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), DateTime.Now.AddDays(-1));

                            var resultCalendarioDiaAnterior = _objCatalogoCalendarioAcademico.obtenerFechadelCalendarioComprobacionAsistencia(int.Parse(Session["periodo"].ToString()), DateTime.Now.AddDays(-1));

                            if (resultFiltradoHorarioDiaAnterior.Count() != 0 && resultCalendarioDiaAnterior == null)
                            {
                                //Verificacion que falta una cabecera actual
                                if (resultCabecera.Count < resultFiltradoHorarioDiaAnterior.Count())
                                {

                                    //Creacion de la cabeceras faltantes
                                    foreach (var item in resultFiltroHorario)
                                    {
                                        if (!resultCabecera.Exists(E => E.idDetalleHorario.idDetalleHorario == item.idDetalleHorario))
                                        {
                                            AgregarCabeceraFaltante(item, listadoEstudiante, DateTime.Now.AddDays(-1));
                                        }
                                    }

                                }//Cierre verificacion y creacion de cabceras faltantes :D  del dia actual
                                else
                                {
                                    //Verificacion si los estudiantes estan ingresados si son apenas agregados a la matricula, todo con el dia anterior
                                    var resultCabeceraDIAS = new catalogoCabecera().obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), DateTime.Now.AddDays(-1));
                                    int contadorA = 0;
                                    foreach (var item in resultCabeceraDIAS)
                                    {
                                        var resultCabeceraAsistencia = _objCatologoCabeceraAsistencia.obtenerCabeceraAsistenciaXIDCabeceraXFecha(item.idCabecera, item.fechaCabecera);
                                        if (!(resultCabeceraAsistencia.Count == listadoEstudiante.Count))
                                        {
                                            foreach (var itemComprobacion in listadoEstudiante)
                                            {
                                                if (!resultCabeceraAsistencia.Exists(X => X.idEstudiante == itemComprobacion.Id_Alumno))
                                                {
                                                    int nroHoraMateria = new catalogoHorario().obtenerNroHoraHorarioXIDDetalleHorario(item.idDetalleHorario.idDetalleHorario);

                                                    // 211045 Mensaje Asistencia ingresada por el docente
                                                    idCabeceraAsistencia = _objCatologoCabeceraAsistencia.insertarCabecetaAsistencia(new cabeceraAsistencia
                                                    {
                                                        idEstudiante = itemComprobacion.Id_Alumno,
                                                        idCabecera = idCabecera,
                                                        idObservacion = 211045
                                                    });

                                                    if (idCabeceraAsistencia != 0)
                                                    {
                                                        contadorA = 0;
                                                        for (int i = 0; i < nroHoraMateria; i++)
                                                        {
                                                            if (
                                                                _objCatalogoAsistencia.ingresarAsistencia(new asistenciaClase(
                                                                0,
                                                                DateTime.Now.AddDays(-1),
                                                                1,
                                                                idCabeceraAsistencia
                                                                ))
                                                                )
                                                            {
                                                                contadorA++;
                                                            }
                                                            else
                                                            {
                                                                i--;
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al ingresar asistencia del estudiante " + itemComprobacion.Nombres + ", con el administrador del sistema.');", true);
                                                    }

                                                }//Validacion cabecera asistencia igual que la lista de estudiantes
                                            }//Cierre bucle horario
                                        }//cierre igual lista de estudiantes
                                    }//Cierr foreach de la cabecera 
                                }//Cierre 
                            } // cierre filtro de horario mas de uno 1
                            else
                            {
                                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('No tiene clases con esta materia el día anterior.');", true);
                            }
                        }


                    }
                    #endregion
                    resultCabecera = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), dia);
                    var resulProtegido = (from item in resultCabecera
                                          where item.protegido == false
                                          select item).ToList();

                    var resulprotegidoDiaAnterior = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoXFechaLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), dia.AddDays(-1));

                    var resulProtegidoAnterior = (from item in resulprotegidoDiaAnterior
                                                  where item.protegido == false
                                                  select item).ToList();

                    if ((resultCabecera.Count != 0) || (resulProtegidoAnterior.Count != 0))
                    {
                        if (resultCabecera.Count != 0)
                        {
                            foreach (var item in resultCabecera)
                            {
                                _objCatalogoCabecera.cambiarEstadoCabecera(item.idCabecera, 211048);

                            }
                        }
                        if (resulProtegidoAnterior.Count != 0)
                        {
                            foreach (var item in resulProtegidoAnterior)
                            {
                                _objCatalogoCabecera.cambiarEstadoCabecera(item.idCabecera, 211048);

                            }
                        }
                        btnConfirmarAsistencia.Visible = true;
                        CargarHTMLEditable();
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Puede empezar a tomar las asistencias, podrá modificar las asistencias hasta 00H00 del siguiente dia, si ud ya confirmo la asistencia no podrá modificarla.');", true);
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Existe registro asistencia del " + dia.ToShortDateString() + ".');", true);
                        CargarHTML();
                        btnConfirmarAsistencia.Visible = false;
                    }
                }
                else
                {
                    Server.Transfer("Default.aspx");
                }
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('El sistema no esta habilitado para tomar asistencias, contacte con el administrador.');", true);
            }
        }
        #endregion


        private void AgregarCabeceraFaltante(horarioClases itemFiltroHorario, List<estudiante> listadoEstudiante, DateTime _dia)
        {
            idCabecera = _objCatalogoCabecera.insertarCabecera(new cabecera(0, itemFiltroHorario, _dia, false, 211048));

            if (idCabecera != 0)
            {
                int contador = 0;

                int nroHoraMateria = new catalogoHorario().obtenerNroHoraHorarioXIDDetalleHorario(itemFiltroHorario.idDetalleHorario);
                foreach (var item in listadoEstudiante)
                {
                    idCabeceraAsistencia = _objCatologoCabeceraAsistencia.insertarCabecetaAsistencia(new cabeceraAsistencia
                    {
                        idEstudiante = item.Id_Alumno,
                        idCabecera = idCabecera,
                        idObservacion = 211045
                    });

                    if (idCabeceraAsistencia != 0)
                    {
                        contador = 0;
                        for (int i = 0; i < nroHoraMateria; i++)
                        {
                            if (
                                _objCatalogoAsistencia.ingresarAsistencia(new asistenciaClase(
                                0,
                                _dia,
                                1,
                                idCabeceraAsistencia
                                ))
                                )
                            {
                                contador++;
                            }
                            else
                            {
                                i--;
                            }
                        }
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al ingresar asistencia del estudiante " + item.Nombres + ", contactese con direccion de carrera.');", true);
                    }
                }
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al ingresar la asistencia, recargue pagina');", true);

            }
        }
        #region BotonConfirmarAsistencia
        protected void btnConfirmarAsistencia_Click(object sender, EventArgs e)
        {
            codigoDistribucion = _objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()); //Codigo de distribucion desencriptado
            DateTime diaAsistencia = DateTime.Now;
            var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(int.Parse(Session["periodo"].ToString()), int.Parse(codigoDistribucion));

            //Buscamos el dia en la base de datos en el horario
            var resultFiltroHorario = (from itemHorario in consultaHorario
                                       where itemHorario.detalle == diaAsistencia.DayOfWeek.ToString()
                                       select itemHorario);
            idPeriodoActual = int.Parse(Session["periodo"].ToString());
            codigoDistribucion = _objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString());

            var listadoEstudiante = _objCatalogoEstudiante.obtenerEstudiante(int.Parse(codigoDistribucion));
            var resultCabecera = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoXFecha(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), diaAsistencia);
            if (resultFiltroHorario.Count() == resultCabecera.Count)
            {
                foreach (var item in resultCabecera)
                {
                    if (_objCatalogoCabecera.protegerCabecera(item.idCabecera, true))
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "sucessMessage('Asistencia Confirmada. El sistema no permitira modificar asistencias del dia " + dia.Date + "');", true);
                        btnConfirmarAsistencia.Visible = false;
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('No se pudo confirmar la asistencia, intentelo de nuevo.');", true);
                    }
                }
                CargarHTML();
            }
            else
            {
                if (resultFiltroHorario.Count() > resultCabecera.Count)
                {
                    foreach (var item in resultFiltroHorario)
                    {
                        AgregarCabeceraFaltante(item, listadoEstudiante, diaAsistencia);
                    }
                }
                resultCabecera = _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoXFecha(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()), diaAsistencia);

                if (resultFiltroHorario.Count() == resultCabecera.Count)
                {
                    foreach (var item in resultCabecera)
                    {
                        if (_objCatalogoCabecera.protegerCabecera(item.idCabecera, true))
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "sucessMessage('Asistencia Confirmada. El sistema no permitira ingresar asistencias del dia " + dia.Date + " pasadas las 00:00 (Hora Servidor).');", true);
                            btnConfirmarAsistencia.Visible = false;
                        }
                        else
                        {
                            ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('No se pudo confirmar la asistencia, intentelo de nuevo.');", true);
                        }
                    }
                    CargarHTML();
                }

            }


        }
        #endregion

        private void CargarHTML()
        {
            var diaHtml = DateTime.Now;
            var diaCabecera = DateTime.Now;
            var listaCabeceraDias = new List<DateTime>();
            idPeriodoActual = int.Parse(Session["periodo"].ToString());
            codigoDistribucion = _objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()); //Codigo de distribucion desencriptado

            //#00a65a Verde para inicio de clases; #0073b7 azul para fin de clases
            var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#00a65a");
            var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#0073b7");
            if (finDeClases != null && inicioDeClases != null)
            {
                var resultCabeceraFiltroDias = from filtro in _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()))
                                               where filtro.fechaCabecera.Month == diaHtml.Month
                                               select filtro;

                var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(idPeriodoActual, int.Parse(codigoDistribucion));
                if (inicioDeClases.start.Value.Month == diaCabecera.Month)
                {
                    foreach (var item in consultaHorario)
                    {
                        diaCabecera = inicioDeClases.start.Value;
                        while ((diaCabecera.DayOfWeek.ToString() != item.detalle) && diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month))
                        {
                            diaCabecera = diaCabecera.AddDays(1);
                        }

                        while (diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month) && diaCabecera.Month == diaHtml.Month)
                        {
                            listaCabeceraDias.Add(diaCabecera);
                            diaCabecera = diaCabecera.AddDays(7);
                        }
                    }

                    foreach (var itemDia in resultCabeceraFiltroDias)
                    {
                        if (resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count() <
                            listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count()
                            )
                        {
                            listaCabeceraDias.Remove(itemDia.fechaCabecera);
                        }
                        else
                        {
                            while (!(listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count() ==
                           resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count()))
                            {
                                listaCabeceraDias.Add(itemDia.fechaCabecera);
                            }
                        }
                    }
                }
                else
                    if (finDeClases.start.Value.Month == diaCabecera.Month)
                {
                    foreach (var item in consultaHorario)
                    {
                        //diaCabecera = finDeClases.start.Value;

                        diaCabecera = new DateTime(finDeClases.start.Value.Year, finDeClases.start.Value.Month, 1);
                        while ((diaCabecera.DayOfWeek.ToString() != item.detalle) && diaCabecera.Day <= finDeClases.start.Value.Day)
                        {
                            diaCabecera = diaCabecera.AddDays(1);
                        }

                        while (diaCabecera.Day <= finDeClases.start.Value.Day && diaCabecera.Month == diaHtml.Month)
                        {
                            listaCabeceraDias.Add(diaCabecera);
                            diaCabecera = diaCabecera.AddDays(7);
                        }
                    }
                    foreach (var itemDia in resultCabeceraFiltroDias)
                    {
                        if (resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count() <
                            listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count()
                            )
                        {
                            listaCabeceraDias.Remove(itemDia.fechaCabecera);
                        }
                        else
                        {
                            while (!(listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count() ==
                           resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count()))
                            {
                                listaCabeceraDias.Add(itemDia.fechaCabecera);
                            }
                        }
                    }
                }
                else
                {
                    foreach (var item in consultaHorario)
                    {
                        diaCabecera = new DateTime(diaHtml.Year, diaHtml.Month, 1);
                        while ((diaCabecera.DayOfWeek.ToString() != item.detalle) && diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month))
                        {
                            diaCabecera = diaCabecera.AddDays(1);
                        }

                        while (diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month) && diaCabecera.Month == diaHtml.Month)
                        {
                            listaCabeceraDias.Add(diaCabecera);
                            diaCabecera = diaCabecera.AddDays(7);
                        }
                    }
                    foreach (var itemDia in resultCabeceraFiltroDias)
                    {
                        if (resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count() <
                            listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count()
                            )
                        {
                            listaCabeceraDias.Remove(itemDia.fechaCabecera);
                        }
                        else
                        {
                            while (!(listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count() ==
                           resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count()))
                            {
                                listaCabeceraDias.Add(itemDia.fechaCabecera);
                            }
                        }
                    }
                }
                var listaCabeceraOrdenada = listaCabeceraDias.OrderBy(C => C.Day);


                #region CARGA DE MES
                string mesTexto = "";
                switch (diaHtml.Month)
                {
                    case 1:
                        mesTexto = "ENERO";
                        break;
                    case 2:
                        mesTexto = "FEBRERO";
                        break;
                    case 3:
                        mesTexto = "MARZO";
                        break;
                    case 4:
                        mesTexto = "ABRIL";
                        break;
                    case 5:
                        mesTexto = "MAYO";
                        break;
                    case 6:
                        mesTexto = "JUNIO";
                        break;
                    case 7:
                        mesTexto = "JULIO";
                        break;
                    case 8:
                        mesTexto = "AGOSTO";
                        break;
                    case 9:
                        mesTexto = "SEPTIEMBRE";
                        break;
                    case 10:
                        mesTexto = "OCTUBRE";
                        break;
                    case 11:
                        mesTexto = "NOVIEMBRE";
                        break;
                    case 12:
                        mesTexto = "DICIEMBRE";
                        break;
                    default:
                        break;
                }
                #endregion

                var listadoEstudiante = _objCatalogoEstudiante.obtenerEstudiante(int.Parse(codigoDistribucion));

                var resultCabecera = from filtro in _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()))
                                     where filtro.fechaCabecera.Month == diaHtml.Month
                                     select filtro;
                tablaEstudiante.Clear();

                //Paso de parametro por medio del metodo GET!
                string idDocente = Session["idDocente"].ToString();
                try
                {
                    tablaEstudiante.Append("<table id='estudianteTable' class='table table-bordered table-hover table-condensed '>" +
                       "<thead>" +
                       "<tr style='height: 15px;'>" +
                       "<td rowspan='3'> <p>N</p> </td>" +
                       "<td rowspan='3' style='text-align: center;'>NÓMINA DE ESTUDIANTES</td>" +
                       "<td style='text-align: right;'> DIA  </td>");
                    //Nro de dias de la semana assitencia
                    foreach (var item in listaCabeceraOrdenada)
                    {
                        tablaEstudiante.Append("<td>" + item.Day + "</td>");
                    }
                    tablaEstudiante.Append(
                       "<td colspan='9' style='text-align: center;'>TOTAL ASISTENCIA</td>" +
                       "<td rowspan='3' style='text-align: center;'><p>T<br/>O<br/>T<br/>A<br/>L</p></td>" +
                       "<td colspan='6' style='text-align: center;'>PORCENTAJE</td>" +
                       "</tr>" +
                       "<tr>" +
                       "<td style='text-align: right;'><p>MES</p></td>");
                    //Número de mes!
                    foreach (var item in listaCabeceraOrdenada)
                    {
                        tablaEstudiante.Append("<td >" + item.Month + "</td>");
                    }
                    tablaEstudiante.Append(
                        "<td colspan='3' style='text-align: center;'>" + mesTexto + "</td>" +
                        "<td colspan='3' style='text-align: center;'>ANTERIOR</td>" +
                        "<td colspan='3' style='text-align: center;'>ACUMULADA</td>" +
                        "<td colspan='3' style='text-align: center;'>" + mesTexto + "</td>" +
                        "<td colspan='3' style='text-align: center;'>ACUMULADA</td>" +
                        "</tr>" +
                        "<tr>" +
                        "<td style='text-align: right;'><p>HORAS</p></td>"
                        );
                    DateTime diaTemporal = new DateTime();
                    foreach (var itemCabeceraOrdenada in listaCabeceraOrdenada)
                    {
                        if (resultCabecera.Count() != 0)
                        {
                            var item = (from itemConsulta in resultCabecera
                                        where itemConsulta.fechaCabecera == itemCabeceraOrdenada
                                        select itemConsulta).ToList();

                            if (item.Count() > 1)
                            {
                                if (!(diaTemporal == itemCabeceraOrdenada))
                                {
                                    foreach (var itemDiasHorario in item)
                                    {
                                        if (item.Count() != 0)
                                        {

                                            DateTime diaHora = DateTime.Now; //Obtiene dia actual
                                            _intervaloHoraEntrada = TimeSpan.Parse(itemDiasHorario.idDetalleHorario.horaEntrada);
                                            _intervaloHoraSalida = TimeSpan.Parse(itemDiasHorario.idDetalleHorario.horaSalida);

                                            DateTime dia1 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0);  //Hora Inicio 
                                            DateTime dia2 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0); //hora Fin
                                            nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;

                                            tablaEstudiante.Append("<td>" + nroHoraDistribucion + "</td>");
                                        }
                                        else
                                        {
                                            tablaEstudiante.Append("<td>0</td>");
                                        }
                                    }
                                }
                            }
                            else
                                if (item.Count() != 0)
                            {
                                DateTime diaHora = DateTime.Now; //Obtiene dia actual
                                _intervaloHoraEntrada = TimeSpan.Parse(item.First().idDetalleHorario.horaEntrada);
                                _intervaloHoraSalida = TimeSpan.Parse(item.First().idDetalleHorario.horaSalida);

                                DateTime dia1 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0);  //Hora Inicio 
                                DateTime dia2 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0); //hora Fin
                                nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;

                                tablaEstudiante.Append("<td>" + nroHoraDistribucion + "</td>");
                            }
                            else
                            {
                                tablaEstudiante.Append("<td>0</td>");
                            }
                        }
                        else
                        {
                            tablaEstudiante.Append("<td>0</td>");
                        }
                        diaTemporal = itemCabeceraOrdenada;
                    }

                    tablaEstudiante.Append("<td>A</td><td>FJ</td><td>FI</td><td>A</td><td>FJ</td><td>FI</td><td>A</td><td>FJ</td><td>FI</td><td>%A</td><td>%FJ</td><td>%FI</td><td>%A</td><td>%F</td><td>%TOTAL</td></tr></thead>" +
                        "<tbody>");
                    nroLista = 0;
                    foreach (var item in listadoEstudiante)
                    {
                        nroLista++;
                        //"<tr class='tool' onmouseover='miniReporte();' onmouseout='cerrarReporte();'>" +
                        tablaEstudiante.Append(
                            "<tr>" +
                            "<td class='lista-estudiantes'>" + nroLista.ToString() + "</td>" +
                            "<td colspan='2' style='width: 250px;' class='lista-estudiantes'>" + item.Apellido_1.ToString() + ' ' + item.Nombres.ToString() + "</td>");
                        diaTemporal = new DateTime();
                        var resultCalendarioFeriado = new catalogoCalendarioAcademico().obtenerCalendarioAcademicoxPeriodoANdMEs(idPeriodoActual, DateTime.Now);
                        var columnaColor = "";
                        var tooltipMensaje = "";
                        foreach (var itemAsistencia in listaCabeceraOrdenada)
                        {
                            if (resultCalendarioFeriado.Count != 0)
                            {
                                if (resultCalendarioFeriado.Exists(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia))
                                {
                                    var resultCalendario = resultCalendarioFeriado.Where(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia).First();
                                    if (resultCalendario.asistencia)
                                    {
                                        tooltipMensaje = "data-toggle='tooltip' data-placement='top' title='ASISTENCIA CONSIDERADA POR " + resultCalendarioFeriado.Where(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia).First().title + "'";
                                        columnaColor = "class='info'";

                                    }
                                    else
                                    {
                                        tooltipMensaje = "data-toggle='tooltip' data-placement='top' title='FECHA NO CONSIDERADA POR " + resultCalendarioFeriado.Where(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia).First().title + "'";
                                        columnaColor = "class='warning'";
                                    }
                                }
                                else
                                {
                                    tooltipMensaje = "";
                                    columnaColor = "";
                                }
                            }
                            else
                            {
                                tooltipMensaje = "";
                                columnaColor = "";
                            }


                            if (resultCabecera.Count() != 0)
                            {
                                var itemEstudiantes = (from itemConsulta in resultCabecera
                                                       where itemConsulta.fechaCabecera == itemAsistencia
                                                       select itemConsulta).ToList();

                                if (itemEstudiantes.Count() > 1)
                                {

                                    if (!(diaTemporal == itemAsistencia))
                                    {
                                        foreach (var itemFiltroAsistencia in itemEstudiantes)
                                        {
                                            if (itemEstudiantes.Count() != 0)
                                            {
                                                var resultAsistencia = _objCatalogoAsistencia.obtenerAsistenciaxIDCabeceraANDidEstudiante(itemFiltroAsistencia.idCabecera, item.Id_Alumno);
                                                if (resultAsistencia.Count != 0)
                                                {
                                                    if (resultAsistencia.Count(R => R.idTipo2 == 2) > 0)
                                                    {
                                                        if (resultAsistencia.Count(C => C.idTipo2 == 1) > 1)
                                                        {
                                                            tablaEstudiante.Append("<td data-toggle='popover' " + columnaColor + " title='Detalle de Justificación' data-content='Para obtener informacion de la justificación, haga clic en el link. </br> <a href=visorJustificacion.aspx?cod=" + _objEncriptaje.encodeControlAsistencia(item.Id_Alumno) + "&coda=" + _objEncriptaje.encodeControlAsistencia(resultAsistencia.First().idAsistencia) + " target=_blank>Ver justificacion</a>' > J " + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                        }
                                                        else
                                                        {
                                                            tablaEstudiante.Append("<td data-toggle='popover' " + columnaColor + " title='Detalle de Justificación' data-content='Para obtener informacion de la justificación, haga clic en el link. </br> <a href=visorJustificacion.aspx?cod=" + _objEncriptaje.encodeControlAsistencia(item.Id_Alumno) + "&coda=" + _objEncriptaje.encodeControlAsistencia(resultAsistencia.First().idAsistencia) + " target=_blank>Ver justificacion</a>' > J </td>");
                                                        }

                                                        //tablaEstudiante.Append("<td>J</td>");
                                                    }
                                                    else

                                                        ////condicion de PATO
                                                        if (resultAsistencia.Count(C => C.idTipo2 == 1) > 0)
                                                    {
                                                        tablaEstudiante.Append("<td " + columnaColor + " data-toggle='tooltip' data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                    }
                                                    else
                                                    {
                                                        tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + " >0</td>");
                                                    }
                                                }
                                                else
                                                {
                                                    tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                                                }
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    if (itemEstudiantes.Count() != 0)
                                    {
                                        var resultAsistencia = _objCatalogoAsistencia.obtenerAsistenciaxIDCabeceraANDidEstudiante(itemEstudiantes.First().idCabecera, item.Id_Alumno);
                                        if (resultAsistencia.Count != 0)
                                        {
                                            if (resultAsistencia.Count(R => R.idTipo2 == 2) > 0)
                                            {
                                                if (resultAsistencia.Count(C => C.idTipo2 == 1) > 1)
                                                {
                                                    tablaEstudiante.Append("<td data-toggle='popover' " + columnaColor + " title='Detalle de Justificación' data-content='Para obtener informacion de la justificación, haga clic en el link. </br> <a href=visorJustificacion.aspx?cod=" + _objEncriptaje.encodeControlAsistencia(item.Id_Alumno) + "&coda=" + _objEncriptaje.encodeControlAsistencia(resultAsistencia.First().idAsistencia) + " target=_blank>Ver justificacion</a>' > J " + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                }
                                                else
                                                {
                                                    tablaEstudiante.Append("<td data-toggle='popover' " + columnaColor + " title='Detalle de Justificación' data-content='Para obtener informacion de la justificación, haga clic en el link. </br> <a href=visorJustificacion.aspx?cod=" + _objEncriptaje.encodeControlAsistencia(item.Id_Alumno) + "&coda=" + _objEncriptaje.encodeControlAsistencia(resultAsistencia.First().idAsistencia) + " target=_blank>Ver justificacion</a>' > J </td>");
                                                }

                                                //tablaEstudiante.Append("<td>J</td>");
                                            }
                                            else
                                            {
                                                ////condicion de PATO
                                                tablaEstudiante.Append("<td data-toggle='tooltip' " + columnaColor + " data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                            }
                                        }
                                        else
                                        {
                                            tablaEstudiante.Append("<td " + columnaColor + "  " + tooltipMensaje + ">0</td>");
                                        }
                                    }
                                    else
                                    {
                                        tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                                    }
                                }
                            }
                            else
                            {
                                tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                            }
                            diaTemporal = itemAsistencia;

                        }


                        var asistenciaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "A", DateTime.Now);
                        var asistenciaJustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "J", DateTime.Now);
                        var asistenciaInjustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "F", DateTime.Now);

                        var asistenciaAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "A");
                        var faltasJustificadasAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "J");
                        var faltasInjustificadasAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "F");
                        var totalAcumulada = asistenciaAcumulada + faltasInjustificadasAcumulada + faltasJustificadasAcumulada;

                        tablaEstudiante.Append("<td class='AsistenciaMesActual'>" + asistenciaMesActual + "</td>");
                        tablaEstudiante.Append(
                            "<td class='FaltasJMesActual'>" + asistenciaJustificadaMesActual + "</td>" +
                            "<td class='FaltasInjustificadasActual'>" + asistenciaInjustificadaMesActual + "</td>" +//asistenciaJustificadaMesActual
                            "<td class='AsistenciaMesPas'>" + (asistenciaAcumulada - asistenciaMesActual) + "</td>" +
                            "<td class='FaltasJMesPas'>" + (faltasJustificadasAcumulada - asistenciaJustificadaMesActual) + "</td>" +
                            "<td class='FaltasInjustificadasPas'>" + (faltasInjustificadasAcumulada - asistenciaInjustificadaMesActual) + "</td>");

                        tablaEstudiante.Append("<td class='AsistenciaAcumulada'>" + asistenciaAcumulada + "</td>");
                        tablaEstudiante.Append("<td class='FaltasJAcumulada'>" + faltasJustificadasAcumulada + "</td>");
                        tablaEstudiante.Append("<td class='FaltasIAcumulada'>" + faltasInjustificadasAcumulada + "</td>");
                        tablaEstudiante.Append("<td class='total'>" + totalAcumulada + "</td>");


                        if (asistenciaMesActual != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaMesActual / (decimal)int.Parse(lblTotalMesActual.Text)) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }

                        if (asistenciaJustificadaMesActual != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaJustificadaMesActual / (decimal)int.Parse(lblTotalMesActual.Text)) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }

                        if (asistenciaInjustificadaMesActual != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaInjustificadaMesActual / (decimal)int.Parse(lblTotalMesActual.Text)) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }



                        if (asistenciaAcumulada != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaAcumulada / (decimal)int.Parse(lblTotalHoras.Text)) * 100) + "%</td>");

                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }

                        if (faltasJustificadasAcumulada != 0 || faltasInjustificadasAcumulada != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)(faltasJustificadasAcumulada + faltasInjustificadasAcumulada) / (decimal)int.Parse(lblTotalHoras.Text)) * 100) + "%</td>");

                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");

                        }


                        if (faltasJustificadasAcumulada != 0 || faltasInjustificadasAcumulada != 0 || asistenciaAcumulada != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)((((decimal)(faltasJustificadasAcumulada + faltasInjustificadasAcumulada) / (decimal)int.Parse(lblTotalHoras.Text)) + ((decimal)asistenciaAcumulada / (decimal)int.Parse(lblTotalHoras.Text))) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");

                        }

                        tablaEstudiante.Append("</tr>");

                    }
                    tablaEstudiante.Append("</tbody></table>");

                    estudiantesCurso.InnerHtml = tablaEstudiante.ToString();

                }
                catch (DivideByZeroException)
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Contactese con el administrador, Error 101.');", true);
                }
                catch (Exception)
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Contactese con el administrador, intentelo de nuevo.');", true);
                }
            }
            else
            {
                ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Contactese con el administrador, intentelo de nuevo.');", true);

            }
        }

        private void CargarHTMLEditable()
        {
            var diaCabecera = DateTime.Now;
            var diaHtml = DateTime.Now;
            var listaCabeceraDias = new List<DateTime>();

            codigoDistribucion = _objEncriptaje.decodeControlAsistencia(Request.QueryString["cod"].ToString()); //Codigo de distribucion desencriptado
            idPeriodoActual = int.Parse(Session["periodo"].ToString());
            var listadoEstudiante = _objCatalogoEstudiante.obtenerEstudiante(int.Parse(codigoDistribucion));

            //#00a65a Verde para inicio de clases; #0073b7 azul para fin de clases
            var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#00a65a");
            var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#0073b7");
            if (finDeClases != null && inicioDeClases != null)
            {
                var resultCabeceraFiltroDias = from filtro in _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()))
                                               where filtro.fechaCabecera.Month == diaHtml.Month
                                               select filtro;

                var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(idPeriodoActual, int.Parse(codigoDistribucion));
                if (inicioDeClases.start.Value.Month == diaCabecera.Month)
                {
                    foreach (var item in consultaHorario)
                    {
                        diaCabecera = inicioDeClases.start.Value;
                        while ((diaCabecera.DayOfWeek.ToString() != item.detalle) && diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month))
                        {
                            diaCabecera = diaCabecera.AddDays(1);
                        }

                        while (diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month) && diaCabecera.Month == diaHtml.Month)
                        {
                            listaCabeceraDias.Add(diaCabecera);
                            diaCabecera = diaCabecera.AddDays(7);
                        }
                    }

                    foreach (var itemDia in resultCabeceraFiltroDias)
                    {
                        if (resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count() <
                            listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count()
                            )
                        {
                            listaCabeceraDias.Remove(itemDia.fechaCabecera);
                        }
                        else
                        {
                            while (!(listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count() ==
                           resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count()))
                            {
                                listaCabeceraDias.Add(itemDia.fechaCabecera);
                            }
                        }
                    }
                }
                else
                    if (finDeClases.start.Value.Month == diaCabecera.Month)
                {
                    foreach (var item in consultaHorario)
                    {
                        //diaCabecera = finDeClases.start.Value;
                        diaCabecera = new DateTime(finDeClases.start.Value.Year, finDeClases.start.Value.Month, 1);
                        while ((diaCabecera.DayOfWeek.ToString() != item.detalle) && diaCabecera.Day <= finDeClases.start.Value.Day)
                        {
                            diaCabecera = diaCabecera.AddDays(1);
                        }

                        while (diaCabecera.Day <= finDeClases.start.Value.Day && diaCabecera.Month == diaHtml.Month)
                        {
                            listaCabeceraDias.Add(diaCabecera);
                            diaCabecera = diaCabecera.AddDays(7);
                        }
                    }
                    foreach (var itemDia in resultCabeceraFiltroDias)
                    {
                        if (resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count() <
                            listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count()
                            )
                        {
                            listaCabeceraDias.Remove(itemDia.fechaCabecera);
                        }
                        else
                        {
                            while (!(listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count() ==
                           resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count()))
                            {
                                listaCabeceraDias.Add(itemDia.fechaCabecera);
                            }
                        }
                    }
                }
                else
                {
                    foreach (var item in consultaHorario)
                    {
                        diaCabecera = new DateTime(diaHtml.Year, diaHtml.Month, 1);
                        while ((diaCabecera.DayOfWeek.ToString() != item.detalle) && diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month))
                        {
                            diaCabecera = diaCabecera.AddDays(1);
                        }

                        while (diaCabecera.Day <= DateTime.DaysInMonth(inicioDeClases.start.Value.Year, inicioDeClases.start.Value.Month) && diaCabecera.Month == diaHtml.Month)
                        {
                            listaCabeceraDias.Add(diaCabecera);
                            diaCabecera = diaCabecera.AddDays(7);
                        }
                    }

                    foreach (var itemDia in resultCabeceraFiltroDias)
                    {
                        if (resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count() <
                            listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count()
                            )
                        {
                            listaCabeceraDias.Remove(itemDia.fechaCabecera);
                        }
                        else
                        {
                            while (!(listaCabeceraDias.Where(C => C.Date == itemDia.fechaCabecera.Date).Count() ==
                           resultCabeceraFiltroDias.Where(E => E.fechaCabecera.Date == itemDia.fechaCabecera.Date).Count()))
                            {
                                listaCabeceraDias.Add(itemDia.fechaCabecera);
                            }
                        }
                    }
                }
                var listaCabeceraOrdenada = listaCabeceraDias.OrderBy(C => C.Day);

                #region CARGA DE MES
                string mesTexto = "";
                switch (DateTime.Now.Month)
                {
                    case 1:
                        mesTexto = "ENERO";
                        break;
                    case 2:
                        mesTexto = "FEBRERO";
                        break;
                    case 3:
                        mesTexto = "MARZO";
                        break;
                    case 4:
                        mesTexto = "ABRIL";
                        break;
                    case 5:
                        mesTexto = "MAYO";
                        break;
                    case 6:
                        mesTexto = "JUNIO";
                        break;
                    case 7:
                        mesTexto = "JULIO";
                        break;
                    case 8:
                        mesTexto = "AGOSTO";
                        break;
                    case 9:
                        mesTexto = "SEPTIEMBRE";
                        break;
                    case 10:
                        mesTexto = "OCTUBRE";
                        break;
                    case 11:
                        mesTexto = "NOVIEMBRE";
                        break;
                    case 12:
                        mesTexto = "DICIEMBRE";
                        break;
                    default:
                        break;
                }
                #endregion


                var resultCabecera = from filtro in _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoLimpia(int.Parse(codigoDistribucion), int.Parse(Session["periodo"].ToString()))
                                     where filtro.fechaCabecera.Month == DateTime.Now.Month
                                     select filtro;
                tablaEstudiante.Clear();

                //Paso de parametro por medio del metodo GET!
                string idDocente = Session["idDocente"].ToString();
                try
                {
                    tablaEstudiante.Append("<table id='estudianteTable' class='table table-bordered table-hover table-condensed '>" +
                       "<thead>" +
                       "<tr style='height: 15px;'>" +
                       "<td rowspan='3'> <p>N</p> </td>" +
                       "<td rowspan='3' style='text-align: center;'>Nomina Estudiantes</td>" +
                       "<td style='text-align: right;'> Dia  </td>");
                    //Nro de dias de la semana assitencia
                    foreach (var item in listaCabeceraOrdenada)
                    {
                        tablaEstudiante.Append("<td>" + item.Day + "</td>");
                    }
                    tablaEstudiante.Append(
                       "<td colspan='9' style='text-align: center;'>TOTAL ASISTENCIA</td>" +
                       "<td rowspan='3' style='text-align: center;'><p>T<br/>O<br/>T<br/>A<br/>L</p></td>" +
                       "<td colspan='6' style='text-align: center;'>PORCENTAJE</td>" +
                       "</tr>" +
                       "<tr>" +
                       "<td style='text-align: right;'><p>" + mesTexto + "</p></td>");
                    //Número de mes!
                    foreach (var item in listaCabeceraOrdenada)
                    {
                        tablaEstudiante.Append("<td >" + item.Month + "</td>");
                    }
                    tablaEstudiante.Append(
                        "<td colspan='3' style='text-align: center;'>" + mesTexto + "</td>" +
                        "<td colspan='3' style='text-align: center;'>ANTERIOR</td>" +
                        "<td colspan='3' style='text-align: center;'>ACUMULADA</td>" +
                        "<td colspan='3' style='text-align: center;'>" + mesTexto + "</td>" +
                        "<td colspan='3' style='text-align: center;'>ACUMULADA</td>" +
                        "</tr>" +
                        "<tr>" +
                        "<td style='text-align: right;'><p>Horas</p></td>"
                        );
                    DateTime diaTemporal = new DateTime();

                    foreach (var itemCabeceraOrdenada in listaCabeceraOrdenada)
                    {
                        if (resultCabecera.Count() != 0)
                        {
                            var item = (from itemConsulta in resultCabecera
                                        where itemConsulta.fechaCabecera == itemCabeceraOrdenada
                                        select itemConsulta).ToList();

                            if (item.Count() > 1)
                            {
                                if (!(diaTemporal == itemCabeceraOrdenada))
                                {
                                    foreach (var itemDiasHorario in item)
                                    {
                                        if (item != null)
                                        {

                                            DateTime diaHora = DateTime.Now; //Obtiene dia actual
                                            _intervaloHoraEntrada = TimeSpan.Parse(itemDiasHorario.idDetalleHorario.horaEntrada);
                                            _intervaloHoraSalida = TimeSpan.Parse(itemDiasHorario.idDetalleHorario.horaSalida);

                                            DateTime dia1 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0);  //Hora Inicio 
                                            DateTime dia2 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0); //hora Fin
                                            nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;

                                            tablaEstudiante.Append("<td>" + nroHoraDistribucion + "</td>");
                                        }
                                        else
                                        {
                                            tablaEstudiante.Append("<td>0</td>");
                                        }
                                    }
                                }
                            }
                            else
                                if (item.Count() != 0)
                            {
                                DateTime diaHora = DateTime.Now; //Obtiene dia actual
                                _intervaloHoraEntrada = TimeSpan.Parse(item.First().idDetalleHorario.horaEntrada);
                                _intervaloHoraSalida = TimeSpan.Parse(item.First().idDetalleHorario.horaSalida);

                                DateTime dia1 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0);  //Hora Inicio 
                                DateTime dia2 = new DateTime(diaHtml.Year, diaHtml.Month, diaHtml.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0); //hora Fin
                                nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;

                                tablaEstudiante.Append("<td>" + nroHoraDistribucion + "</td>");
                            }
                            else
                            {
                                tablaEstudiante.Append("<td>0</td>");
                            }
                        }
                        else
                        {
                            tablaEstudiante.Append("<td>0</td>");
                        }
                        diaTemporal = itemCabeceraOrdenada;
                    }
                    tablaEstudiante.Append("<td>A</td><td>FJ</td><td>FI</td><td>A</td><td>FJ</td><td>FI</td><td>A</td><td>FJ</td><td>FI</td><td>%A</td><td>%FJ</td><td>%FI</td><td>%A</td><td>%F</td><td>%TOTAL</td></tr></thead>" +
                        "<tbody>");

                    nroLista = 0;
                    foreach (var item in listadoEstudiante)
                    {
                        nroLista++;
                        //bool bandera = false;
                        //"<tr class='tool' onmouseover='miniReporte();' onmouseout='cerrarReporte();'>" +
                        tablaEstudiante.Append(
                            "<tr>" +
                            "<td class='lista-estudiantes'>" + nroLista.ToString() + "</td>" +
                            "<td colspan='2' style='width: 250px;' class='lista-estudiantes'>" + item.Apellido_1.ToString() + ' ' + item.Nombres.ToString() + "</td>");

                        var resultCalendarioFeriado = new catalogoCalendarioAcademico().obtenerCalendarioAcademicoxPeriodoANdMEs(idPeriodoActual, DateTime.Now);
                        var columnaColor = "";
                        var tooltipMensaje = "";
                        foreach (var itemAsistencia in listaCabeceraOrdenada)
                        {
                            if (resultCalendarioFeriado.Count != 0)
                            {
                                if (resultCalendarioFeriado.Exists(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia))
                                {
                                    var resultCalendario = resultCalendarioFeriado.Where(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia).First();
                                    if (resultCalendario.asistencia)
                                    {
                                        tooltipMensaje = "data-toggle='tooltip' data-placement='top' title='ASISTENCIA CONSIDERADA POR " + resultCalendarioFeriado.Where(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia).First().title + "'";
                                        columnaColor = "class='info'";

                                    }
                                    else
                                    {
                                        tooltipMensaje = "data-toggle='tooltip' data-placement='top' title='FECHA NO CONSIDERADA POR " + resultCalendarioFeriado.Where(E => E.start.Value.Date <= itemAsistencia && E.end.Value.Date >= itemAsistencia).First().title + "'";
                                        columnaColor = "class='warning'";
                                    }
                                }
                                else
                                {
                                    tooltipMensaje = "";
                                    columnaColor = "";
                                }
                            }
                            else
                            {
                                tooltipMensaje = "";
                                columnaColor = "";
                            }
                            if (resultCabecera.Count() != 0)
                            {
                                var itemEstudiantes = (from itemConsulta in resultCabecera
                                                       where itemConsulta.fechaCabecera == itemAsistencia
                                                       select itemConsulta).ToList();
                                if (itemEstudiantes.Count() > 1)
                                {
                                    if (!(diaTemporal == itemAsistencia))
                                    {
                                        foreach (var itemEditableAsistencia in itemEstudiantes)
                                        {
                                            var resultAsistencia = _objCatalogoAsistencia.obtenerAsistenciaxIDCabeceraANDidEstudiante(itemEditableAsistencia.idCabecera, item.Id_Alumno);
                                            if (resultAsistencia.Count() != 0)
                                            {

                                                if (resultAsistencia.Count(E => E.idTipo2 == 2) > 0)
                                                {
                                                    //tablaEstudiante.Append("<td data-toggle='popover' title='Justificación' data-content='" + resultAsistencia.First().CabeceraAsistencia.observacion + "<br><a href='#' > Ver justificacion</a>'>J</td>");
                                                    if (resultAsistencia.Count(C => C.idTipo2 == 1) > 1)
                                                    {
                                                        tablaEstudiante.Append("<td " + columnaColor + " > J " + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                    }
                                                    else
                                                    {
                                                        tablaEstudiante.Append("<td" + columnaColor + "> J </td>");
                                                    }
                                                }
                                                else

                                                    if ((itemEditableAsistencia.fechaCabecera.Date == DateTime.Now.Date) || (itemEditableAsistencia.fechaCabecera.Date == DateTime.Now.Date.AddHours(-24)))
                                                {

                                                    if (itemEditableAsistencia.protegido == true)
                                                    {
                                                        tablaEstudiante.Append("<td " + columnaColor + " data-toggle='tooltip' data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "' >" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                    }
                                                    else
                                                    {
                                                        tablaEstudiante.Append("<td class='editAsistencia' style='background-color:#dff0d8' data-id='" + _objEncriptaje.encodeControlAsistencia(item.Id_Alumno) + "' data-cab='" + _objEncriptaje.encodeControlAsistencia(itemEditableAsistencia.idCabecera) + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                    }
                                                }
                                                else
                                                {
                                                    tablaEstudiante.Append("<td " + columnaColor + " data-toggle='tooltip' data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                }
                                            }
                                            else
                                            {
                                                tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                                            }
                                        }
                                    }
                                    //////////////////////////////////////////////////////////////////////////////////////
                                    //else
                                    //{
                                    //    if (bandera==false)
                                    //    {
                                    //        bandera = true;
                                    //        foreach (var itemEditableAsistencia in itemEstudiantes)
                                    //        {
                                    //            var resultAsistencia = _objCatalogoAsistencia.obtenerAsistenciaxIDCabeceraANDidEstudiante(itemEditableAsistencia.idCabecera, item.Id_Alumno);
                                    //            if (resultAsistencia.Count() != 0)
                                    //            {

                                    //                if (resultAsistencia.Count(E => E.idTipo2 == 2) > 0)
                                    //                {
                                    //                    //tablaEstudiante.Append("<td data-toggle='popover' title='Justificación' data-content='" + resultAsistencia.First().CabeceraAsistencia.observacion + "<br><a href='#' > Ver justificacion</a>'>J</td>");
                                    //                    if (resultAsistencia.Count(C => C.idTipo2 == 1) > 1)
                                    //                    {
                                    //                        tablaEstudiante.Append("<td " + columnaColor + " > J " + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                    //                    }
                                    //                    else
                                    //                    {
                                    //                        tablaEstudiante.Append("<td" + columnaColor + "> J </td>");
                                    //                    }
                                    //                }
                                    //                else if ((itemEditableAsistencia.fechaCabecera.Date == DateTime.Now.Date) || (itemEditableAsistencia.fechaCabecera.Date == DateTime.Now.Date.AddHours(-24)))
                                    //                {

                                    //                    if (itemEditableAsistencia.protegido == true)
                                    //                    {
                                    //                        tablaEstudiante.Append("<td " + columnaColor + " data-toggle='tooltip' data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "' >" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                    //                    }
                                    //                    else
                                    //                    {
                                    //                        tablaEstudiante.Append("<td class='editAsistencia' style='background-color:#dff0d8' data-id='" + _objEncriptaje.encodeControlAsistencia(item.Id_Alumno) + "' data-cab='" + _objEncriptaje.encodeControlAsistencia(itemEditableAsistencia.idCabecera) + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                    //                    }
                                    //                }
                                    //                else
                                    //                {
                                    //                    tablaEstudiante.Append("<td " + columnaColor + " data-toggle='tooltip' data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                    //                }
                                    //            }
                                    //            else
                                    //            {
                                    //                tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                                    //            }
                                    //        }
                                    //    }

                                    //}
                                    //////////////////////////////////////////////////////////////////////////////////////
                                }
                                else
                                {
                                    if (itemEstudiantes.Count() != 0)
                                    {
                                        var resultAsistencia = _objCatalogoAsistencia.obtenerAsistenciaxIDCabeceraANDidEstudiante(itemEstudiantes.First().idCabecera, item.Id_Alumno);

                                        if (resultAsistencia.Count != 0)
                                        {
                                            if (resultAsistencia.Count(E => E.idTipo2 == 2) > 0)
                                            {
                                                //tablaEstudiante.Append("<td data-toggle='popover' title='Justificación' data-content='" + resultAsistencia.First().CabeceraAsistencia.observacion + "<br><a href='#' > Ver justificacion</a>'>J</td>");
                                                if (resultAsistencia.Count(C => C.idTipo2 == 1) > 1)
                                                {
                                                    tablaEstudiante.Append("<td " + columnaColor + " > J " + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                }
                                                else
                                                {
                                                    tablaEstudiante.Append("<td " + columnaColor + " > J </td>");
                                                }
                                            }
                                            else

                                                if ((itemEstudiantes.First().fechaCabecera.Date == DateTime.Now.Date) || (itemEstudiantes.First().fechaCabecera.Date == DateTime.Now.Date.AddHours(-24)))
                                            {
                                                if (itemEstudiantes.First().protegido == true)
                                                {
                                                    tablaEstudiante.Append("<td " + columnaColor + " data-toggle='tooltip' data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "' >" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                }
                                                else
                                                {
                                                    tablaEstudiante.Append("<td class='editAsistencia' style='background-color:#dff0d8' data-id='" + _objEncriptaje.encodeControlAsistencia(item.Id_Alumno) + "' data-cab='" + _objEncriptaje.encodeControlAsistencia(itemEstudiantes.First().idCabecera) + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                                }
                                            }
                                            else
                                            {
                                                tablaEstudiante.Append("<td " + columnaColor + " data-toggle='tooltip' data-placement='top' title='" + resultAsistencia.First().CabeceraAsistencia.observacion + "'>" + resultAsistencia.Count(C => C.idTipo2 == 1) + "</td>");
                                            }
                                        }
                                        else
                                        {
                                            tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                                        }
                                    }
                                    else
                                    {
                                        tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                                    }
                                }
                            }
                            else
                            {
                                tablaEstudiante.Append("<td " + columnaColor + " " + tooltipMensaje + ">0</td>");
                            }
                            diaTemporal = itemAsistencia;
                        }


                        var asistenciaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "A", DateTime.Now);
                        var asistenciaJustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "J", DateTime.Now);
                        var asistenciaInjustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "F", DateTime.Now);

                        var asistenciaAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "A");
                        var faltasJustificadasAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "J");
                        var faltasInjustificadasAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, int.Parse(codigoDistribucion), item.Id_Alumno, "F");
                        var totalAcumulada = asistenciaAcumulada + faltasInjustificadasAcumulada + faltasJustificadasAcumulada;

                        tablaEstudiante.Append("<td class='AsistenciaMesActual'>" + asistenciaMesActual + "</td>");
                        tablaEstudiante.Append(
                            "<td class='FaltasJMesActual'>" + asistenciaJustificadaMesActual + "</td>" +
                            "<td class='FaltasInjustificadasActual'>" + asistenciaInjustificadaMesActual + "</td>" +//asistenciaJustificadaMesActual
                            "<td class='AsistenciaMesPas'>" + (asistenciaAcumulada - asistenciaMesActual) + "</td>" +
                            "<td class='FaltasJMesPas'>" + (faltasJustificadasAcumulada - asistenciaJustificadaMesActual) + "</td>" +
                            "<td class='FaltasInjustificadasPas'>" + (faltasInjustificadasAcumulada - asistenciaInjustificadaMesActual) + "</td>");

                        tablaEstudiante.Append("<td class='AsistenciaAcumulada'>" + asistenciaAcumulada + "</td>");
                        tablaEstudiante.Append("<td class='FaltasJAcumulada'>" + faltasJustificadasAcumulada + "</td>");
                        tablaEstudiante.Append("<td class='FaltasIAcumulada'>" + faltasInjustificadasAcumulada + "</td>");
                        tablaEstudiante.Append("<td class='total'>" + totalAcumulada + "</td>");

                        if (asistenciaMesActual != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaMesActual / (decimal)int.Parse(lblTotalMesActual.Text)) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }

                        if (asistenciaJustificadaMesActual != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaJustificadaMesActual / (decimal)int.Parse(lblTotalMesActual.Text)) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }

                        if (asistenciaInjustificadaMesActual != 0 && lblTotalMesActual.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaInjustificadaMesActual / (decimal)int.Parse(lblTotalMesActual.Text)) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }



                        if (asistenciaAcumulada != 0 && lblTotalHoras.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)asistenciaAcumulada / (decimal)int.Parse(lblTotalHoras.Text)) * 100) + "%</td>");

                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");
                        }

                        if (faltasJustificadasAcumulada != 0 && lblTotalHoras.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)(((decimal)faltasJustificadasAcumulada / (decimal)int.Parse(lblTotalHoras.Text)) * 100) + "%</td>");

                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");

                        }


                        if (faltasJustificadasAcumulada != 0 || faltasInjustificadasAcumulada != 0 || asistenciaAcumulada != 0 && lblTotalHoras.Text != "0")
                        {
                            tablaEstudiante.Append("<td class='active'>" + (int)((((decimal)(faltasJustificadasAcumulada + faltasInjustificadasAcumulada) / (decimal)int.Parse(lblTotalHoras.Text)) + ((decimal)asistenciaAcumulada / (decimal)int.Parse(lblTotalHoras.Text))) * 100) + "%</td>");
                        }
                        else
                        {
                            tablaEstudiante.Append("<td class='active'>0%</td>");

                        }

                        tablaEstudiante.Append("</tr>");

                    }
                    tablaEstudiante.Append("</tbody></table>");

                    estudiantesCurso.InnerHtml = tablaEstudiante.ToString();

                }
                catch (DivideByZeroException)
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Contactese con el administrador, Error 101.');", true);
                }
                catch (Exception)
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "errorMessage('Contactese con el administrador, intentelo de nuevo.');", true);
                }
            }
        }

        [System.Web.Services.WebMethod(true)]
        public static string addAsistencia(asistenciaClase _asistencia)
        {
            encriptaje _objEncriptaje = new encriptaje();
            catalogoAsistencia _objCatalogoAsistencia = new catalogoAsistencia();
            catalogoCabeceraAsistencia _objCatalogoCabeceraAsistencia = new catalogoCabeceraAsistencia();
            catalogoHorario _objCatalogoHorario = new catalogoHorario();
            DateTime hoy = DateTime.Now;

            int idEstudiante = int.Parse(_objEncriptaje.decodeControlAsistencia(_asistencia.idEstudiante));
            int idCabecera = int.Parse(_objEncriptaje.decodeControlAsistencia(_asistencia.cabecera));
            int contador = 0;
            var cabeceraAsistencia = _objCatalogoCabeceraAsistencia.obtenerCabeceraAsistenciaXIDCabeceraANDIDEstudiante(idCabecera, idEstudiante);
            if (!string.IsNullOrEmpty(_asistencia.contenido))
            {
                int nroHora = int.Parse(_asistencia.contenido);
                var asistenciaEstudiante = _objCatalogoAsistencia.obtenerAsistenciaxIDCabeceraANDidEstudiante(idCabecera, idEstudiante);
                int nroHoraMateria = _objCatalogoHorario.obtenerNroHoraHorarioXIDDetalleHorario(cabeceraAsistencia.Cabecera.idDetalleHorario.idDetalleHorario);
                if (nroHora == 0)
                {
                    if (nroHoraMateria != 0)
                    {
                        contador = 0;
                        for (int i = 0; i < nroHoraMateria; i++)
                        {
                            //3 indica falta
                            if (
                                _objCatalogoAsistencia.modificarAsistencia(
                                asistenciaEstudiante[i].idAsistencia,
                                3,
                                211047
                                )
                                )
                            {
                                contador++;
                            }
                        }
                        if (contador == asistenciaEstudiante.Count)
                        {
                            return "Se modificaron " + contador + " horas de Asistencia.";
                        }
                        else
                        {
                            return "Error al modificar la asistencia, intente de nuevo";
                        }
                    }
                    else
                    {
                        return "Error el registro de asistencia";
                    }
                }
                else
                {
                    if (nroHoraMateria != 0)
                    {
                        var resultHorasFaltasAsistencia = nroHoraMateria - nroHora;

                        contador = 0;
                        for (int i = 0; i < nroHoraMateria; i++)
                        {
                            // 1 indica asistencia
                            // 211047 Asistencia modificado por el docente
                            if (
                                _objCatalogoAsistencia.modificarAsistencia(
                                asistenciaEstudiante[i].idAsistencia,
                                1,
                                211047
                                )
                                )
                            {
                                contador++;
                            }
                        }

                        if (contador == asistenciaEstudiante.Count)
                        {
                            contador = 0;
                            for (int i = 0; i < resultHorasFaltasAsistencia; i++)
                            {
                                // 1 indica asistencia, 3 faltas
                                // 21107 Asistencia modificado por el docente
                                if (
                                    _objCatalogoAsistencia.modificarAsistencia(
                                    asistenciaEstudiante[i].idAsistencia,
                                    3,
                                    211047
                                    )
                                    )
                                {
                                    contador++;
                                }
                            }
                            if (asistenciaEstudiante.Count == nroHora)
                            {
                                return "Se modificaron " + nroHora + " horas de Asistencia.";
                            }
                            else
                                if (contador == resultHorasFaltasAsistencia)
                            {
                                return "Se modificaron " + contador + " horas de Asistencia.";
                            }
                            else
                            {
                                return "Error al modificar la asistencia, intente de nuevo";
                            }
                        }
                        else
                        {
                            return "Error al modificar la asistencia, intente de nuevo";
                        }
                    }
                    else
                    {
                        return "Error al modificar la asistencia, intente de nuevo";
                    }
                }
            }
            else
            {
                return "Error el registro de asistencia";
            }
        }

        //[System.Web.Services.WebMethod(true)]
        //public static string obtenerTipoAsistencia(string codDistribucion, int periodo)
        //{
        //    int codigoDistribucion = int.Parse(new encriptaje().decodeControlAsistencia(codDistribucion)); //Codigo de distribucion desencriptado
        //    int nrodeHora = new catalogoHorario().obtenerNroHoraHorario(periodo, codigoDistribucion);            

        //    StringBuilder array = new StringBuilder();
        //    array.Clear();
        //    array.Append("{");

        //    try
        //    {
        //        int i = nrodeHora;
        //        while(i > -1)
        //        {
        //           array.Append("'"+i+"':'"+i+"',");
        //           i--;
        //        }
        //    }
        //    catch (Exception)
        //    {
        //        array.Append("'1':'Error intente refrescar la página',");                
        //    }           

        //    array.Append("}");
        //    return array.ToString();        
        //}

        [System.Web.Services.WebMethod(true)]
        public static Dictionary<string, string> obtenerTipoAsistencia(string id)
        {
            int nrodeHora = 0;

            int idCabecera = Convert.ToInt32(new encriptaje().decodeControlAsistencia(id));
            var cabeceraAsistencia = new catalogoCabeceraAsistencia().obtenerCabeceraAsistenciaXIDCabecera(idCabecera).First();
            if (cabeceraAsistencia != null)
            {
                nrodeHora = new catalogoHorario().obtenerNroHoraHorarioXIDDetalleHorario(cabeceraAsistencia.Cabecera.idDetalleHorario.idDetalleHorario);
            }
            else
            {
                nrodeHora = 0;
            }


            Dictionary<string, string> _obj = new Dictionary<string, string>();

            try
            {

                int i = nrodeHora;
                while (i > -1)
                {
                    _obj.Add(i.ToString(), i.ToString());
                    i--;
                }
                return _obj;

            }
            catch (Exception)
            {
                Dictionary<string, string> _obj2 = new Dictionary<string, string>();
                _obj2.Add("1", "Error intente refrescar la página");
                return _obj2;
            }

        }

        protected void Timer1_Tick(object sender, EventArgs e)
        {
            Timer1.Enabled = false;
            Response.Redirect("carreras.aspx");
        }

        protected void chbHabilitarReportes_CheckedChanged(object sender, EventArgs e)
        {
            int __idDistribucion = int.Parse(codigoDistribucion);
            idPeriodoActual = int.Parse(Session["periodo"].ToString());
            DateTime fecha = DateTime.Now.AddMonths(-1);
            var resultPermiso = new catalogoPermiso().obtenerPermisoXidDistribucionXidMes(__idDistribucion, idPeriodoActual, fecha);

            if (resultPermiso != null)
            {
                if (chbHabilitarReportes.Checked)
                {
                    if (_objCatalogoPermiso.modificarPermiso(resultPermiso.idPermiso, true))
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Aceptado el acuerdo de veracidad.');", true);
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al habilitar información.');", true);
                    }
                }
                else
                {
                    if (_objCatalogoPermiso.modificarPermiso(resultPermiso.idPermiso, false))
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Ha desahilitado acuerdo de veracidad.');", true);
                    }
                    else
                    {
                        ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al habilitar información.');", true);
                    }
                }
            }
            else
            {
                if (_objCatalogoPermiso.ingresarPermiso(idPeriodoActual, __idDistribucion, fecha, chbHabilitarReportes.Checked))
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:sucessMessage('Aceptado el acuerdo de veracidad.');", true);
                }
                else
                {
                    ClientScript.RegisterStartupScript(GetType(), "jsMensaje", "javascript:errorMessage('Error al habilitar información.');", true);
                }
            }


        }

    }
}